// 泛型  在定义函数或者是类的时候，不知道数据的类型
// 可以用泛型  当传值的时候就知道啦。
// 用的时候是什么类型泛型就是 什么类型
// 保证数据类型一致
// 1,一个泛型
function fn<T>(a:T):T {
    return a
}

 let res= fn(10)//自动识别
 let res2= fn<string> ('hello') //明确告诉


//  2,多个泛型

function fn2<T,K>(a:T,b:K) {
    console.log(b);
    return a
    
}
fn2<number,string>(123,"hello")

// 限制泛型的 范围
interface Inter{
    length:number
}
// T extends Inter 表示泛型T 必须是Inter的实现类 （子类）
function fn3<T extends Inter>(a:T) {
      return a.length
}
fn3("123")


// 类中使用泛型 用的时候才知道 是什么类型
class MyClass<T>{
   name:T;
   constructor(name:T){
     this.name=name
   }
}

const mc=new MyClass<string>('孙悟空')